<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>对象额外方法的补充</title>
  <!-- 
  在JavaScript中，对象是一个非常重要的概念，它不仅可以存储数据，还可以包含方法。除了常用的对象操作方法，JavaScript 还提供了一些额外的方法来增强对象的功能和灵活性。
  一、 `Object.create()` 
  - 功能：创建一个新对象，使用指定的原型对象和可选的属性。
  - 示例：
  const proto = {
      greet: function() {
          console.log('Hello, ' + this.name);
      }
  };

  const obj = Object.create(proto);
  obj.name = 'Alice';
  obj.greet(); // 输出: Hello, Alice
  
  二、 `Object.assign()` 
  - 功能：将所有可枚举的属性从一个或多个源对象复制到目标对象。返回目标对象。
  - 示例：
  const target = { a: 1 };
  const source = { b: 2, c: 3 };

  Object.assign(target, source);
  console.log(target); // 输出: { a: 1, b: 2, c: 3 }

  三、 `Object.keys()` 
  - 功能：返回一个数组，包含对象自身的所有可枚举属性的键（字符串形式）。
  - 示例：
  const obj = { a: 1, b: 2, c: 3 };
  const keys = Object.keys(obj);
  console.log(keys); // 输出: ['a', 'b', 'c']

  四、 `Object.values()` 
  - 功能：返回一个数组，包含对象自身的所有可枚举属性的值。
  - 示例：
  const obj = { a: 1, b: 2, c: 3 };
  const values = Object.values(obj);
  console.log(values); // 输出: [1, 2, 3]

  五、 `Object.entries()` 
  - 功能：返回一个数组，包含对象自身的所有可枚举属性的键值对数组。
  - 示例：
  const obj = { a: 1, b: 2, c: 3 };
  const entries = Object.entries(obj);
  console.log(entries); // 输出: [['a', 1], ['b', 2], ['c', 3]]

  六、 `Object.freeze()` 
  - 功能：冻结一个对象，使其不可变。不能添加、删除或修改现有属性。
  - 示例：
  const obj = { a: 1 };
  Object.freeze(obj);
  obj.a = 2; // 无法修改
  console.log(obj.a); // 输出: 1
  七、 `Object.seal()` 

  - 功能：密封一个对象，防止添加新属性，但可以修改现有属性。
  - 示例：
  const obj = { a: 1 };
  Object.seal(obj);
  obj.a = 2; // 可以修改
  obj.b = 3; // 无法添加新属性
  console.log(obj); // 输出: { a: 2 }

  八、 `Object.getOwnPropertyDescriptor()` 
  - 功能：返回一个对象自身的指定属性的描述符。
  const obj = { a: 1 };
  const descriptor = Object.getOwnPropertyDescriptor(obj, 'a');
  console.log(descriptor); // 输出: { value: 1, writable: true, enumerable: true, configurable: true }

  九、 `Object.getOwnPropertyDescriptors()` 
  - 功能：返回一个对象自身所有属性的描述符。
  const obj = { a: 1, b: 2 };
  const descriptors = Object.getOwnPropertyDescriptors(obj);
  console.log(descriptors);
  // 输出: { a: { value: 1, writable: true, enumerable: true, configurable: true }, b: { value: 2, writable: true, enumerable: true, configurable: true } }
  十、总结
  JavaScript 对象的方法非常丰富，除了常用的属性和方法外，还有许多额外的方法可以帮助开发者更灵活地操作对象。理解这些方法的用法，可以帮助开发者编写更加高效和可维护的代码。掌握这些额外方法有助于更好地进行对象的管理、克隆、冻结、密封等操作，提高代码的可读性和性能。
   -->
</head>
<body>

  <script>
    // 一、`Object.assign()`
    // 功能：将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
    // 示例：
    const target = { a: 1, b: 2 };
    const source = { b: 4, c: 5 };
    const returnedTarget = Object.assign(target, source);
    console.log(target); // 输出: { a: 1, b: 4, c: 5 }

    // 二、`Object.create()`
    // 功能：创建一个新对象，使用现有的对象来提供新创建的对象的__proto__。
    // 示例：
    const person = {
      isHuman: false,
      printIntroduction: function () {
        console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
      }
    };
    const me = Object.create(person);
    me.name = "Matthew"; // "name" 是 me 的属性
    me.isHuman = true; // 继承的属性被修改了
    me.printIntroduction(); // 输出: My name is Matthew. Am I human? true

    // 三、`Object.defineProperty()`
    // 功能：直接在一个对象上定义一个新属性，或者修改一个对象的现有属性，并返回这个对象。
    // 示例：
    const obj = {};
    Object.defineProperty(obj, 'a', {
      value: 37,
      writable: false
    });
    obj.a = 38;
    console.log(obj.a); // 输出: 37

    // 四、`Object.freeze()`
    // 功能：冻结一个对象，其他代码不能删除或修改该对象的属性。
    // 示例：
    const obj2 = {
      prop: 42
    };
    Object.freeze(obj2);
    obj2.prop = 33;
    console.log(obj2.prop); // 输出: 42

    // 五、`Object.seal()`
    // 功能：封闭一个对象，阻止添加新属性并将所有现有属性标记为不可配置。
    // 示例：
    const obj3 = {
      prop: 42
    };
    Object.seal(obj3);
    obj3.prop = 33;
    console.log(obj3.prop); // 输出: 33
    delete obj3.prop; // false

    // 六、`Object.preventExtensions()`
    // 功能：阻止对象添加新属性。
    // 示例：
    const obj4 = {
      prop: 42
    };
    Object.preventExtensions(obj4);
    obj4.newProp = 33;
    console.log(obj4.newProp); // 输出: undefined

    // 七、`Object.isSealed()`
    // 功能：判断一个对象是否被封闭。
    // 示例：
    const obj5 = {
      prop: 42
    };
    Object.seal(obj5);
    
  </script>
  
</body>
</html>